/************************************************************************
 * $Id: BaseValidator.java,v 1.6 2010/02/25 10:37:08 wjh Exp $
 * Created on Nov 26, 2008 5:25:23 PM By yjx
 *
 * herostart_zh 
 *
 * Copyright (c) 2007-2008 Herostart Group.
 * All rights reserved.
 * <a href="http://www.herostart.com.cn">http://www.herostart.com.cn</a>
 ***********************************************************************/
package com.java.control.formvalidator;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

/**
 * <p>验证类</p>
 *
 * 
 * @author $Author: wjh $
 * @version $Revision: 1.6 ${Date}:Nov 26, 2008 5:25:23 PM $
 */
public abstract class BaseValidator implements Validator {
	
	private static final String EMAIL_CHICK = "[a-zA-Z0-9]+([_\\.-][a-zA-Z0-9]+)*@([a-zA-Z0-9]+([\\.-][a-zA-Z0-9]+)*)+\\.[a-zA-Z]{2,}";// 邮箱格式
	/**
	 * 非空验证
	 *
	 * @param Errors errors :返回页面的错误集合
	 * @param String name :实体绑定要验证的字段
	 * @param String text :字段的名称
	 * @return 无
	 */
	protected void checkTextEmpty(Errors errors,String name,String text){
		//ValidationUtils.rejectIfEmpty(errors, name,"required."+name, "<font color='red'>"+text+"不能为空</font>");
		ValidationUtils.rejectIfEmpty(errors, name,"required."+name, text+"不能为空");
	}
	
	/**
	 * 数字的验证,数字只能为endBit位或为空
	 *
	 * @param Errors errors :返回页面的错误集合
	 * @param String name :实体绑定要验证的字段
	 * @param String text :字段的名称
	 * @param String orig :要验证的字符
	 * @param Integer bit:数字验证的位数
	 * @return 无
	 */
	protected void checkTextNumber(Errors errors,String orig,String name,String text,Integer bit){
		if(!matcher(orig,bit,bit))
			this.rejectValue(errors, name, text+"为"+bit+"位数字");
	}
	
	/**
	 * 数字的验证,数字位数从beginBit位到endBit位或为空
	 *
	 * @param Errors errors :返回页面的错误集合
	 * @param String name :实体绑定要验证的字段
	 * @param String text :字段的名称
	 * @param String orig :要验证的字符
	 * @param Integer beginBit :数字验证的开始位数
	 * @param Integer endBit:数字验证的结束位数
	 * @return 无
	 */
	protected void checkTextNumber(Errors errors,String orig,String name,String text,Integer beginBit,Integer endBit){
		if(!matcher(orig,beginBit,endBit))
			this.rejectValue(errors, name, text+"为"+beginBit+"~"+endBit+"位数字");
	}
	
	/**
	 * 数值验证,字段只能为数值或为空
	 *
	 * @param Errors errors :返回页面的错误集合
	 * @param String name :实体绑定要验证的字段
	 * @param String text :字段的名称
	 * @param String orig :要验证的字符
	 * @return 无
	 */
	protected void checkTextNumber(Errors errors,String orig,String name,String text){
		this.check(errors, "^\\d+(\\.\\d+)?$", orig, name, text+"只能为数值");
	}
	
	/**
	 * 通过正则表达式验证
	 *
	 * @param Errors errors :返回页面的错误集合
	 * @param String name :实体绑定要验证的字段
	 * @param String text :在页面上显示的错误信息
	 * @param String orig :要验证的字符
	 * @param String regex :验证的正则表达式
	 * @return 无
	 */
	protected void check(Errors errors,String regex,String orig,String name,String text){
		if(!matcher(regex,orig))
			this.rejectValue(errors, name, text);
	}
	
	/**
	 * 验证邮箱格式
	 *
	 * @param Errors errors :返回页面的错误集合
	 * @param String name :实体绑定要验证的字段
	 * @param String email :要验证的邮箱内容
	 */
	protected void validateEmail(Errors errors,String name,String email){
		if(!matcher(EMAIL_CHICK,email)){
			this.rejectValue(errors, name, "邮箱格式不正确");
		}
	}
	
	/** Method Function Description
	 *
	 * @param Errors errors :返回页面的错误集合
	 * @param String detail :要验证的字符串
	 * @param String name :实体绑定要验证的字段
	 * @param String text :在页面上显示的错误信息
	 * @param int i :要求的长度
	 * @throws ExceptionClass 说明
	 */
	public void checkMaxNumber(Errors errors, String detail, String name,String text, int i) {
		if(detail != null && detail.length()>i)
			this.rejectValue(errors, name, text+"长度应在"+i+"个字符以内");
		
	}
	
	
	/**
	 * 记录错误信息
	 *
	 * @param  参数变量 参数类型，说明
	 * @return 返回值 参数类型
	 */
	protected void rejectValue(Errors errors,String name,String text){
		//errors.rejectValue(name,"invalid."+name,"<font color='red'>"+text+"</font>");
		errors.rejectValue(name,"invalid."+name,text);
	}
	
	
	//可为空在bbit于ebit位之间的数字
	private boolean matcher(String orig,int bbit,int ebit){
		return this.matcher(orig,bbit, ebit,true);
	}
	
	private boolean matcher(String orig , int bbit,int ebit,boolean canEmpty){
		if(null != orig) {
			Matcher matcher = Pattern.compile(constructReg(bbit,ebit,canEmpty)).matcher(orig);
			if(matcher.matches())
				return true;
			else
				return false;
		} else 
			return false;
	}
	
	private String constructReg(Integer bbit,Integer ebit,boolean canEmpty){
		StringBuffer regex = new StringBuffer();
		regex.append("\\d{"+bbit);
		regex.append(","+ebit+"}");
		if(canEmpty)
			regex.append("|\\d{0}");
		return regex.toString();
	}
	
	protected boolean matcher(String regex,String orig){
		Matcher matcher = Pattern.compile(regex).matcher(orig);
		if(matcher.matches())
			return true;
		else
			return false;
	}
}
